/*
Copyright (C) 2006 - 2011 Evan Teran
                          eteran@alum.rit.edu

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef OPTABLE_FPU_20080314_TCC_
#define OPTABLE_FPU_20080314_TCC_

#include "Operand.h"

// this table is for x87 opcodes with a mod < 0xc0
template <class M>
const typename Instruction<M>::opcode_entry Instruction<M>::Opcodes_x87_Lo[64] = {

	/* 0xd8 0x00 - 0xd8 0xbf */
	{ "fadd", &Instruction::decode_SingleReal, OP_FADD, FLAG_NONE, 1 },
	{ "fmul", &Instruction::decode_SingleReal, OP_FMUL, FLAG_NONE, 1 },
	{ "fcom", &Instruction::decode_SingleReal, OP_FCOM, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::decode_SingleReal, OP_FCOMP, FLAG_NONE, 1 },
	{ "fsub", &Instruction::decode_SingleReal, OP_FSUB, FLAG_NONE, 1 },
	{ "fsubr", &Instruction::decode_SingleReal, OP_FSUBR, FLAG_NONE, 1 },
	{ "fdiv", &Instruction::decode_SingleReal, OP_FDIV, FLAG_NONE, 1 },
	{ "fdivr", &Instruction::decode_SingleReal, OP_FDIVR, FLAG_NONE, 1 },

	/* 0xd9 0x00 - 0xd9 0xbf */
	{ "fld", &Instruction::decode_SingleReal, OP_FLD, FLAG_NONE, 1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fst", &Instruction::decode_SingleReal, OP_FST, FLAG_NONE, 1 },
	{ "fstp", &Instruction::decode_SingleReal, OP_FSTP, FLAG_NONE, 1 },
	{ "fldenv", &Instruction::decode_M28, OP_FLDENV, FLAG_NONE, 1 },
	{ "fldcw", &Instruction::decode_Mw, OP_FLDCW, FLAG_NONE, 1 },
	{ "fstenv", &Instruction::decode_M28, OP_FSTENV, FLAG_NONE, 1 },
	{ "fstcw", &Instruction::decode_Mw, OP_FSTCW, FLAG_NONE, 1 },

	/* 0xda 0x00 - 0xda 0xbf */
	{ "fiadd", &Instruction::decode_ShortInteger, OP_FIADD, FLAG_NONE, 1 },
	{ "fimul", &Instruction::decode_ShortInteger, OP_FIMUL, FLAG_NONE, 1 },
	{ "ficom", &Instruction::decode_ShortInteger, OP_FICOM, FLAG_NONE, 1 },
	{ "ficomp", &Instruction::decode_ShortInteger, OP_FICOMP, FLAG_NONE, 1 },
	{ "fisub", &Instruction::decode_ShortInteger, OP_FISUB, FLAG_NONE, 1 },
	{ "fisubr", &Instruction::decode_ShortInteger, OP_FISUBR, FLAG_NONE, 1 },
	{ "fidiv", &Instruction::decode_ShortInteger, OP_FIDIV, FLAG_NONE, 1 },
	{ "fidivr", &Instruction::decode_ShortInteger, OP_FIDIVR, FLAG_NONE, 1 },

	/* 0xdb 0x00 - 0xdb 0xbf */
	{ "fild", &Instruction::decode_ShortInteger, OP_FILD, FLAG_NONE, 1 },
	{ "fisttp", &Instruction::decode_ShortInteger, OP_FISTTP, FLAG_NONE, 1 },
	{ "fist", &Instruction::decode_ShortInteger, OP_FIST, FLAG_NONE, 1 },
	{ "fistp", &Instruction::decode_ShortInteger, OP_FISTP, FLAG_NONE, 1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fld", &Instruction::decode_ExtendedReal, OP_FLD, FLAG_NONE, 1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fstp", &Instruction::decode_ExtendedReal, OP_FSTP, FLAG_NONE, 1 },

	/* 0xdc 0x00 - 0xdc 0xbf */
	{ "fadd", &Instruction::decode_DoubleReal, OP_FADD, FLAG_NONE, 1 },
	{ "fmul", &Instruction::decode_DoubleReal, OP_FMUL, FLAG_NONE, 1 },
	{ "fcom", &Instruction::decode_DoubleReal, OP_FCOM, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::decode_DoubleReal, OP_FCOMP, FLAG_NONE, 1 },
	{ "fsub", &Instruction::decode_DoubleReal, OP_FSUB, FLAG_NONE, 1 },
	{ "fsubr", &Instruction::decode_DoubleReal, OP_FSUBR, FLAG_NONE, 1 },
	{ "fdiv", &Instruction::decode_DoubleReal, OP_FDIV, FLAG_NONE, 1 },
	{ "fdivr", &Instruction::decode_DoubleReal, OP_FDIVR, FLAG_NONE, 1 },

	/* 0xdd 0x00 - 0xdd 0xbf */
	{ "fld", &Instruction::decode_DoubleReal, OP_FLD, FLAG_NONE, 1 },
	{ "fisttp", &Instruction::decode_LongInteger, OP_FISTTP, FLAG_NONE, 1 },
	{ "fst", &Instruction::decode_DoubleReal, OP_FST, FLAG_NONE, 1 },
	{ "fstp", &Instruction::decode_DoubleReal, OP_FSTP, FLAG_NONE, 1 },
	{ "frstor", &Instruction::decode_M108, OP_FRSTOR, FLAG_NONE, 1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fsave", &Instruction::decode_M108, OP_FSAVE, FLAG_NONE, 1 },
	{ "fstsw", &Instruction::decode_Mw, OP_FSTSW, FLAG_NONE, 1 },

	/* 0xde 0x00 - 0xde 0xbf */
	{ "fiadd", &Instruction::decode_WordInteger, OP_FIADD, FLAG_NONE, 1 },
	{ "fimul", &Instruction::decode_WordInteger, OP_FIMUL, FLAG_NONE, 1 },
	{ "ficom", &Instruction::decode_WordInteger, OP_FICOM, FLAG_NONE, 1 },
	{ "ficomp", &Instruction::decode_WordInteger, OP_FICOMP, FLAG_NONE, 1 },
	{ "fisub", &Instruction::decode_WordInteger, OP_FISUB, FLAG_NONE, 1 },
	{ "fisubr", &Instruction::decode_WordInteger, OP_FISUBR, FLAG_NONE, 1 },
	{ "fidiv", &Instruction::decode_WordInteger, OP_FIDIV, FLAG_NONE, 1 },
	{ "fidivr", &Instruction::decode_WordInteger, OP_FIDIVR, FLAG_NONE, 1 },

	/* 0xdf 0x00 - 0xdf 0xbf */
	{ "fild", &Instruction::decode_WordInteger, OP_FILD, FLAG_NONE, 1 },
	{ "fisttp", &Instruction::decode_WordInteger, OP_FISTTP, FLAG_NONE, 1 },
	{ "fist", &Instruction::decode_WordInteger, OP_FIST, FLAG_NONE, 1 },
	{ "fistp", &Instruction::decode_WordInteger, OP_FISTP, FLAG_NONE, 1 },
	{ "fbld", &Instruction::decode_PackedBCD, OP_FBLD, FLAG_NONE, 1 },
	{ "fild", &Instruction::decode_LongInteger, OP_FILD, FLAG_NONE, 1 },
	{ "fbstp", &Instruction::decode_PackedBCD, OP_FBSTP, FLAG_NONE, 1 },
	{ "fistp", &Instruction::decode_LongInteger, OP_FISTP, FLAG_NONE, 1 },
};

// this table is for x87 opcodes with a mod >= 0xc0
template <class M>
const typename Instruction<M>::opcode_entry Instruction<M>::Opcodes_x87_Hi[0x200] = {

	/* 0xd8 0xc0 - 0xd8 0xff */
	{ "fadd", &Instruction::template decode_ST_STi<0>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_ST_STi<1>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_ST_STi<2>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_ST_STi<3>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_ST_STi<4>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_ST_STi<5>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_ST_STi<6>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_ST_STi<7>, OP_FADD, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_ST_STi<0>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_ST_STi<1>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_ST_STi<2>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_ST_STi<3>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_ST_STi<4>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_ST_STi<5>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_ST_STi<6>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_ST_STi<7>, OP_FMUL, FLAG_NONE, 2 },
	{ "fcom", &Instruction::template decode_STi<0>, OP_FCOM, FLAG_NONE, 1 },
	{ "fcom", &Instruction::template decode_STi<1>, OP_FCOM, FLAG_NONE, 1 },
	{ "fcom", &Instruction::template decode_STi<2>, OP_FCOM, FLAG_NONE, 1 },
	{ "fcom", &Instruction::template decode_STi<3>, OP_FCOM, FLAG_NONE, 1 },
	{ "fcom", &Instruction::template decode_STi<4>, OP_FCOM, FLAG_NONE, 1 },
	{ "fcom", &Instruction::template decode_STi<5>, OP_FCOM, FLAG_NONE, 1 },
	{ "fcom", &Instruction::template decode_STi<6>, OP_FCOM, FLAG_NONE, 1 },
	{ "fcom", &Instruction::template decode_STi<7>, OP_FCOM, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::template decode_STi<0>, OP_FCOMP, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::template decode_STi<1>, OP_FCOMP, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::template decode_STi<2>, OP_FCOMP, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::template decode_STi<3>, OP_FCOMP, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::template decode_STi<4>, OP_FCOMP, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::template decode_STi<5>, OP_FCOMP, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::template decode_STi<6>, OP_FCOMP, FLAG_NONE, 1 },
	{ "fcomp", &Instruction::template decode_STi<7>, OP_FCOMP, FLAG_NONE, 1 },
	{ "fsub", &Instruction::template decode_ST_STi<0>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_ST_STi<1>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_ST_STi<2>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_ST_STi<3>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_ST_STi<4>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_ST_STi<5>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_ST_STi<6>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_ST_STi<7>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_ST_STi<0>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_ST_STi<1>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_ST_STi<2>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_ST_STi<3>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_ST_STi<4>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_ST_STi<5>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_ST_STi<6>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_ST_STi<7>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_ST_STi<0>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_ST_STi<1>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_ST_STi<2>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_ST_STi<3>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_ST_STi<4>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_ST_STi<5>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_ST_STi<6>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_ST_STi<7>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_ST_STi<0>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_ST_STi<1>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_ST_STi<2>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_ST_STi<3>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_ST_STi<4>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_ST_STi<5>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_ST_STi<6>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_ST_STi<7>, OP_FDIVR, FLAG_NONE, 2 },

	/* 0xd9 0xc0 - 0xd9 0xff */
	{ "fld", &Instruction::template decode_STi<0>, OP_FLD, FLAG_NONE, 1 },
	{ "fld", &Instruction::template decode_STi<1>, OP_FLD, FLAG_NONE, 1 },
	{ "fld", &Instruction::template decode_STi<2>, OP_FLD, FLAG_NONE, 1 },
	{ "fld", &Instruction::template decode_STi<3>, OP_FLD, FLAG_NONE, 1 },
	{ "fld", &Instruction::template decode_STi<4>, OP_FLD, FLAG_NONE, 1 },
	{ "fld", &Instruction::template decode_STi<5>, OP_FLD, FLAG_NONE, 1 },
	{ "fld", &Instruction::template decode_STi<6>, OP_FLD, FLAG_NONE, 1 },
	{ "fld", &Instruction::template decode_STi<7>, OP_FLD, FLAG_NONE, 1 },
	{ "fxch", &Instruction::template decode_STi<0>, OP_FXCH, FLAG_NONE, 1 },
	{ "fxch", &Instruction::template decode_STi<1>, OP_FXCH, FLAG_NONE, 1 },
	{ "fxch", &Instruction::template decode_STi<2>, OP_FXCH, FLAG_NONE, 1 },
	{ "fxch", &Instruction::template decode_STi<3>, OP_FXCH, FLAG_NONE, 1 },
	{ "fxch", &Instruction::template decode_STi<4>, OP_FXCH, FLAG_NONE, 1 },
	{ "fxch", &Instruction::template decode_STi<5>, OP_FXCH, FLAG_NONE, 1 },
	{ "fxch", &Instruction::template decode_STi<6>, OP_FXCH, FLAG_NONE, 1 },
	{ "fxch", &Instruction::template decode_STi<7>, OP_FXCH, FLAG_NONE, 1 },
	{ "fnop", &Instruction::decode0, OP_FNOP, FLAG_NONE, 0 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fchs", &Instruction::decode0, OP_FCHS, FLAG_NONE, 0 },
	{ "fabs", &Instruction::decode0, OP_FABS, FLAG_NONE, 0 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "ftst", &Instruction::decode0, OP_FTST, FLAG_NONE, 0 },
	{ "fxam", &Instruction::decode0, OP_FXAM, FLAG_NONE, 0 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fld1", &Instruction::decode0, OP_FLD1, FLAG_NONE, 0 },
	{ "fldl2t", &Instruction::decode0, OP_FLDL2T, FLAG_NONE, 0 },
	{ "fldl2e", &Instruction::decode0, OP_FLDL2E, FLAG_NONE, 0 },
	{ "fldpi", &Instruction::decode0, OP_FLDPI, FLAG_NONE, 0 },
	{ "fldlg2", &Instruction::decode0, OP_FLDLG2, FLAG_NONE, 0 },
	{ "fldln2", &Instruction::decode0, OP_FLDLN2, FLAG_NONE, 0 },
	{ "fldz", &Instruction::decode0, OP_FLDZ, FLAG_NONE, 0 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "f2xm1", &Instruction::decode0, OP_F2XM1, FLAG_NONE, 0 },
	{ "fyl2x", &Instruction::decode0, OP_FYL2X, FLAG_NONE, 0 },
	{ "fptan", &Instruction::decode0, OP_FPTAN, FLAG_NONE, 0 },
	{ "fpatan", &Instruction::decode0, OP_FPATAN, FLAG_NONE, 0 },
	{ "fxtract", &Instruction::decode0, OP_FXTRACT, FLAG_NONE, 0 },
	{ "fprem1", &Instruction::decode0, OP_FPREM1, FLAG_NONE, 0 },
	{ "fdecstp", &Instruction::decode0, OP_FDECSTP, FLAG_NONE, 0 },
	{ "fincstp", &Instruction::decode0, OP_FINCSTP, FLAG_NONE, 0 },
	{ "fprem", &Instruction::decode0, OP_FPREM, FLAG_NONE, 0 },
	{ "fyl2xp1", &Instruction::decode0, OP_FYL2XP1, FLAG_NONE, 0 },
	{ "fsqrt", &Instruction::decode0, OP_FSQRT, FLAG_NONE, 0 },
	{ "fsincos", &Instruction::decode0, OP_FSINCOS, FLAG_NONE, 0 },
	{ "frndint", &Instruction::decode0, OP_FRNDINT, FLAG_NONE, 0 },
	{ "fscale", &Instruction::decode0, OP_FSCALE, FLAG_NONE, 0 },
	{ "fsin", &Instruction::decode0, OP_FSIN, FLAG_NONE, 0 },
	{ "fcos", &Instruction::decode0, OP_FCOS, FLAG_NONE, 0 },

	/* 0xda 0xc0 - 0xda 0xff */
	{ "fcmovb", &Instruction::template decode_ST_STi<0>, OP_FCMOVB, FLAG_NONE, 2 },
	{ "fcmovb", &Instruction::template decode_ST_STi<1>, OP_FCMOVB, FLAG_NONE, 2 },
	{ "fcmovb", &Instruction::template decode_ST_STi<2>, OP_FCMOVB, FLAG_NONE, 2 },
	{ "fcmovb", &Instruction::template decode_ST_STi<3>, OP_FCMOVB, FLAG_NONE, 2 },
	{ "fcmovb", &Instruction::template decode_ST_STi<4>, OP_FCMOVB, FLAG_NONE, 2 },
	{ "fcmovb", &Instruction::template decode_ST_STi<5>, OP_FCMOVB, FLAG_NONE, 2 },
	{ "fcmovb", &Instruction::template decode_ST_STi<6>, OP_FCMOVB, FLAG_NONE, 2 },
	{ "fcmovb", &Instruction::template decode_ST_STi<7>, OP_FCMOVB, FLAG_NONE, 2 },
	{ "fcmove", &Instruction::template decode_ST_STi<0>, OP_FCMOVE, FLAG_NONE, 2 },
	{ "fcmove", &Instruction::template decode_ST_STi<1>, OP_FCMOVE, FLAG_NONE, 2 },
	{ "fcmove", &Instruction::template decode_ST_STi<2>, OP_FCMOVE, FLAG_NONE, 2 },
	{ "fcmove", &Instruction::template decode_ST_STi<3>, OP_FCMOVE, FLAG_NONE, 2 },
	{ "fcmove", &Instruction::template decode_ST_STi<4>, OP_FCMOVE, FLAG_NONE, 2 },
	{ "fcmove", &Instruction::template decode_ST_STi<5>, OP_FCMOVE, FLAG_NONE, 2 },
	{ "fcmove", &Instruction::template decode_ST_STi<6>, OP_FCMOVE, FLAG_NONE, 2 },
	{ "fcmove", &Instruction::template decode_ST_STi<7>, OP_FCMOVE, FLAG_NONE, 2 },
	{ "fcmovbe", &Instruction::template decode_ST_STi<0>, OP_FCMOVBE, FLAG_NONE, 2 },
	{ "fcmovbe", &Instruction::template decode_ST_STi<1>, OP_FCMOVBE, FLAG_NONE, 2 },
	{ "fcmovbe", &Instruction::template decode_ST_STi<2>, OP_FCMOVBE, FLAG_NONE, 2 },
	{ "fcmovbe", &Instruction::template decode_ST_STi<3>, OP_FCMOVBE, FLAG_NONE, 2 },
	{ "fcmovbe", &Instruction::template decode_ST_STi<4>, OP_FCMOVBE, FLAG_NONE, 2 },
	{ "fcmovbe", &Instruction::template decode_ST_STi<5>, OP_FCMOVBE, FLAG_NONE, 2 },
	{ "fcmovbe", &Instruction::template decode_ST_STi<6>, OP_FCMOVBE, FLAG_NONE, 2 },
	{ "fcmovbe", &Instruction::template decode_ST_STi<7>, OP_FCMOVBE, FLAG_NONE, 2 },
	{ "fcmovu", &Instruction::template decode_ST_STi<0>, OP_FCMOVU, FLAG_NONE, 2 },
	{ "fcmovu", &Instruction::template decode_ST_STi<1>, OP_FCMOVU, FLAG_NONE, 2 },
	{ "fcmovu", &Instruction::template decode_ST_STi<2>, OP_FCMOVU, FLAG_NONE, 2 },
	{ "fcmovu", &Instruction::template decode_ST_STi<3>, OP_FCMOVU, FLAG_NONE, 2 },
	{ "fcmovu", &Instruction::template decode_ST_STi<4>, OP_FCMOVU, FLAG_NONE, 2 },
	{ "fcmovu", &Instruction::template decode_ST_STi<5>, OP_FCMOVU, FLAG_NONE, 2 },
	{ "fcmovu", &Instruction::template decode_ST_STi<6>, OP_FCMOVU, FLAG_NONE, 2 },
	{ "fcmovu", &Instruction::template decode_ST_STi<7>, OP_FCMOVU, FLAG_NONE, 2 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fucompp", &Instruction::decode0, OP_FUCOMPP, FLAG_NONE, 0 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },


	/* 0xdb 0xc0 - 0xdb 0xff */
	{ "fcmovnb", &Instruction::template decode_ST_STi<0>, OP_FCMOVNB, FLAG_NONE, 2 },
	{ "fcmovnb", &Instruction::template decode_ST_STi<1>, OP_FCMOVNB, FLAG_NONE, 2 },
	{ "fcmovnb", &Instruction::template decode_ST_STi<2>, OP_FCMOVNB, FLAG_NONE, 2 },
	{ "fcmovnb", &Instruction::template decode_ST_STi<3>, OP_FCMOVNB, FLAG_NONE, 2 },
	{ "fcmovnb", &Instruction::template decode_ST_STi<4>, OP_FCMOVNB, FLAG_NONE, 2 },
	{ "fcmovnb", &Instruction::template decode_ST_STi<5>, OP_FCMOVNB, FLAG_NONE, 2 },
	{ "fcmovnb", &Instruction::template decode_ST_STi<6>, OP_FCMOVNB, FLAG_NONE, 2 },
	{ "fcmovnb", &Instruction::template decode_ST_STi<7>, OP_FCMOVNB, FLAG_NONE, 2 },
	{ "fcmovne", &Instruction::template decode_ST_STi<0>, OP_FCMOVNE, FLAG_NONE, 2 },
	{ "fcmovne", &Instruction::template decode_ST_STi<1>, OP_FCMOVNE, FLAG_NONE, 2 },
	{ "fcmovne", &Instruction::template decode_ST_STi<2>, OP_FCMOVNE, FLAG_NONE, 2 },
	{ "fcmovne", &Instruction::template decode_ST_STi<3>, OP_FCMOVNE, FLAG_NONE, 2 },
	{ "fcmovne", &Instruction::template decode_ST_STi<4>, OP_FCMOVNE, FLAG_NONE, 2 },
	{ "fcmovne", &Instruction::template decode_ST_STi<5>, OP_FCMOVNE, FLAG_NONE, 2 },
	{ "fcmovne", &Instruction::template decode_ST_STi<6>, OP_FCMOVNE, FLAG_NONE, 2 },
	{ "fcmovne", &Instruction::template decode_ST_STi<7>, OP_FCMOVNE, FLAG_NONE, 2 },
	{ "fcmovnbe", &Instruction::template decode_ST_STi<0>, OP_FCMOVNBE, FLAG_NONE, 2 },
	{ "fcmovnbe", &Instruction::template decode_ST_STi<1>, OP_FCMOVNBE, FLAG_NONE, 2 },
	{ "fcmovnbe", &Instruction::template decode_ST_STi<2>, OP_FCMOVNBE, FLAG_NONE, 2 },
	{ "fcmovnbe", &Instruction::template decode_ST_STi<3>, OP_FCMOVNBE, FLAG_NONE, 2 },
	{ "fcmovnbe", &Instruction::template decode_ST_STi<4>, OP_FCMOVNBE, FLAG_NONE, 2 },
	{ "fcmovnbe", &Instruction::template decode_ST_STi<5>, OP_FCMOVNBE, FLAG_NONE, 2 },
	{ "fcmovnbe", &Instruction::template decode_ST_STi<6>, OP_FCMOVNBE, FLAG_NONE, 2 },
	{ "fcmovnbe", &Instruction::template decode_ST_STi<7>, OP_FCMOVNBE, FLAG_NONE, 2 },
	{ "fcmovnu", &Instruction::template decode_ST_STi<0>, OP_FCMOVNU, FLAG_NONE, 2 },
	{ "fcmovnu", &Instruction::template decode_ST_STi<1>, OP_FCMOVNU, FLAG_NONE, 2 },
	{ "fcmovnu", &Instruction::template decode_ST_STi<2>, OP_FCMOVNU, FLAG_NONE, 2 },
	{ "fcmovnu", &Instruction::template decode_ST_STi<3>, OP_FCMOVNU, FLAG_NONE, 2 },
	{ "fcmovnu", &Instruction::template decode_ST_STi<4>, OP_FCMOVNU, FLAG_NONE, 2 },
	{ "fcmovnu", &Instruction::template decode_ST_STi<5>, OP_FCMOVNU, FLAG_NONE, 2 },
	{ "fcmovnu", &Instruction::template decode_ST_STi<6>, OP_FCMOVNU, FLAG_NONE, 2 },
	{ "fcmovnu", &Instruction::template decode_ST_STi<7>, OP_FCMOVNU, FLAG_NONE, 2 },
	{ "fneni", &Instruction::decode0, OP_FNENI, FLAG_NONE, 0 },
	{ "fndisi", &Instruction::decode0, OP_FNDISI, FLAG_NONE, 0 },
	{ "fnclex", &Instruction::decode0, OP_FNCLEX, FLAG_NONE, 0 },
	{ "fninit", &Instruction::decode0, OP_FNINIT, FLAG_NONE, 0 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fucomi", &Instruction::template decode_ST_STi<0>, OP_FUCOMI, FLAG_NONE, 2 },
	{ "fucomi", &Instruction::template decode_ST_STi<1>, OP_FUCOMI, FLAG_NONE, 2 },
	{ "fucomi", &Instruction::template decode_ST_STi<2>, OP_FUCOMI, FLAG_NONE, 2 },
	{ "fucomi", &Instruction::template decode_ST_STi<3>, OP_FUCOMI, FLAG_NONE, 2 },
	{ "fucomi", &Instruction::template decode_ST_STi<4>, OP_FUCOMI, FLAG_NONE, 2 },
	{ "fucomi", &Instruction::template decode_ST_STi<5>, OP_FUCOMI, FLAG_NONE, 2 },
	{ "fucomi", &Instruction::template decode_ST_STi<6>, OP_FUCOMI, FLAG_NONE, 2 },
	{ "fucomi", &Instruction::template decode_ST_STi<7>, OP_FUCOMI, FLAG_NONE, 2 },
	{ "fcomi", &Instruction::template decode_ST_STi<0>, OP_FCOMI, FLAG_NONE, 2 },
	{ "fcomi", &Instruction::template decode_ST_STi<1>, OP_FCOMI, FLAG_NONE, 2 },
	{ "fcomi", &Instruction::template decode_ST_STi<2>, OP_FCOMI, FLAG_NONE, 2 },
	{ "fcomi", &Instruction::template decode_ST_STi<3>, OP_FCOMI, FLAG_NONE, 2 },
	{ "fcomi", &Instruction::template decode_ST_STi<4>, OP_FCOMI, FLAG_NONE, 2 },
	{ "fcomi", &Instruction::template decode_ST_STi<5>, OP_FCOMI, FLAG_NONE, 2 },
	{ "fcomi", &Instruction::template decode_ST_STi<6>, OP_FCOMI, FLAG_NONE, 2 },
	{ "fcomi", &Instruction::template decode_ST_STi<7>, OP_FCOMI, FLAG_NONE, 2 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },

	/* 0xdc 0xc0 - 0xdc 0xff */
	{ "fadd", &Instruction::template decode_STi_ST<0>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_STi_ST<1>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_STi_ST<2>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_STi_ST<3>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_STi_ST<4>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_STi_ST<5>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_STi_ST<6>, OP_FADD, FLAG_NONE, 2 },
	{ "fadd", &Instruction::template decode_STi_ST<7>, OP_FADD, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_STi_ST<0>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_STi_ST<1>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_STi_ST<2>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_STi_ST<3>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_STi_ST<4>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_STi_ST<5>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_STi_ST<6>, OP_FMUL, FLAG_NONE, 2 },
	{ "fmul", &Instruction::template decode_STi_ST<7>, OP_FMUL, FLAG_NONE, 2 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fsubr", &Instruction::template decode_STi_ST<0>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_STi_ST<1>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_STi_ST<2>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_STi_ST<3>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_STi_ST<4>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_STi_ST<5>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_STi_ST<6>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsubr", &Instruction::template decode_STi_ST<7>, OP_FSUBR, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_STi_ST<0>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_STi_ST<1>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_STi_ST<2>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_STi_ST<3>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_STi_ST<4>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_STi_ST<5>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_STi_ST<6>, OP_FSUB, FLAG_NONE, 2 },
	{ "fsub", &Instruction::template decode_STi_ST<7>, OP_FSUB, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_STi_ST<0>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_STi_ST<1>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_STi_ST<2>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_STi_ST<3>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_STi_ST<4>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_STi_ST<5>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_STi_ST<6>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdivr", &Instruction::template decode_STi_ST<7>, OP_FDIVR, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_STi_ST<0>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_STi_ST<1>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_STi_ST<2>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_STi_ST<3>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_STi_ST<4>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_STi_ST<5>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_STi_ST<6>, OP_FDIV, FLAG_NONE, 2 },
	{ "fdiv", &Instruction::template decode_STi_ST<7>, OP_FDIV, FLAG_NONE, 2 },

	/* 0xdd 0xc0 - 0xdd 0xff */
	{ "ffree", &Instruction::template decode_STi<0>, OP_FFREE, FLAG_NONE, 1 },
	{ "ffree", &Instruction::template decode_STi<1>, OP_FFREE, FLAG_NONE, 1 },
	{ "ffree", &Instruction::template decode_STi<2>, OP_FFREE, FLAG_NONE, 1 },
	{ "ffree", &Instruction::template decode_STi<3>, OP_FFREE, FLAG_NONE, 1 },
	{ "ffree", &Instruction::template decode_STi<4>, OP_FFREE, FLAG_NONE, 1 },
	{ "ffree", &Instruction::template decode_STi<5>, OP_FFREE, FLAG_NONE, 1 },
	{ "ffree", &Instruction::template decode_STi<6>, OP_FFREE, FLAG_NONE, 1 },
	{ "ffree", &Instruction::template decode_STi<7>, OP_FFREE, FLAG_NONE, 1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fst", &Instruction::template decode_STi<0>, OP_FST, FLAG_NONE, 1 },
	{ "fst", &Instruction::template decode_STi<1>, OP_FST, FLAG_NONE, 1 },
	{ "fst", &Instruction::template decode_STi<2>, OP_FST, FLAG_NONE, 1 },
	{ "fst", &Instruction::template decode_STi<3>, OP_FST, FLAG_NONE, 1 },
	{ "fst", &Instruction::template decode_STi<4>, OP_FST, FLAG_NONE, 1 },
	{ "fst", &Instruction::template decode_STi<5>, OP_FST, FLAG_NONE, 1 },
	{ "fst", &Instruction::template decode_STi<6>, OP_FST, FLAG_NONE, 1 },
	{ "fst", &Instruction::template decode_STi<7>, OP_FST, FLAG_NONE, 1 },
	{ "fstp", &Instruction::template decode_STi<0>, OP_FSTP, FLAG_NONE, 1 },
	{ "fstp", &Instruction::template decode_STi<1>, OP_FSTP, FLAG_NONE, 1 },
	{ "fstp", &Instruction::template decode_STi<2>, OP_FSTP, FLAG_NONE, 1 },
	{ "fstp", &Instruction::template decode_STi<3>, OP_FSTP, FLAG_NONE, 1 },
	{ "fstp", &Instruction::template decode_STi<4>, OP_FSTP, FLAG_NONE, 1 },
	{ "fstp", &Instruction::template decode_STi<5>, OP_FSTP, FLAG_NONE, 1 },
	{ "fstp", &Instruction::template decode_STi<6>, OP_FSTP, FLAG_NONE, 1 },
	{ "fstp", &Instruction::template decode_STi<7>, OP_FSTP, FLAG_NONE, 1 },
	{ "fucom", &Instruction::template decode_STi<0>, OP_FUCOM, FLAG_NONE, 1 },
	{ "fucom", &Instruction::template decode_STi<1>, OP_FUCOM, FLAG_NONE, 1 },
	{ "fucom", &Instruction::template decode_STi<2>, OP_FUCOM, FLAG_NONE, 1 },
	{ "fucom", &Instruction::template decode_STi<3>, OP_FUCOM, FLAG_NONE, 1 },
	{ "fucom", &Instruction::template decode_STi<4>, OP_FUCOM, FLAG_NONE, 1 },
	{ "fucom", &Instruction::template decode_STi<5>, OP_FUCOM, FLAG_NONE, 1 },
	{ "fucom", &Instruction::template decode_STi<6>, OP_FUCOM, FLAG_NONE, 1 },
	{ "fucom", &Instruction::template decode_STi<7>, OP_FUCOM, FLAG_NONE, 1 },
	{ "fucomp", &Instruction::template decode_STi<0>, OP_FUCOMP, FLAG_NONE, 1 },
	{ "fucomp", &Instruction::template decode_STi<1>, OP_FUCOMP, FLAG_NONE, 1 },
	{ "fucomp", &Instruction::template decode_STi<2>, OP_FUCOMP, FLAG_NONE, 1 },
	{ "fucomp", &Instruction::template decode_STi<3>, OP_FUCOMP, FLAG_NONE, 1 },
	{ "fucomp", &Instruction::template decode_STi<4>, OP_FUCOMP, FLAG_NONE, 1 },
	{ "fucomp", &Instruction::template decode_STi<5>, OP_FUCOMP, FLAG_NONE, 1 },
	{ "fucomp", &Instruction::template decode_STi<6>, OP_FUCOMP, FLAG_NONE, 1 },
	{ "fucomp", &Instruction::template decode_STi<7>, OP_FUCOMP, FLAG_NONE, 1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },

	/* 0xde 0xc0 - 0xde 0xff */
	{ "faddp", &Instruction::template decode_STi_ST<0>, OP_FADDP, FLAG_NONE, 2 },
	{ "faddp", &Instruction::template decode_STi_ST<1>, OP_FADDP, FLAG_NONE, 2 },
	{ "faddp", &Instruction::template decode_STi_ST<2>, OP_FADDP, FLAG_NONE, 2 },
	{ "faddp", &Instruction::template decode_STi_ST<3>, OP_FADDP, FLAG_NONE, 2 },
	{ "faddp", &Instruction::template decode_STi_ST<4>, OP_FADDP, FLAG_NONE, 2 },
	{ "faddp", &Instruction::template decode_STi_ST<5>, OP_FADDP, FLAG_NONE, 2 },
	{ "faddp", &Instruction::template decode_STi_ST<6>, OP_FADDP, FLAG_NONE, 2 },
	{ "faddp", &Instruction::template decode_STi_ST<7>, OP_FADDP, FLAG_NONE, 2 },
	{ "fmulp", &Instruction::template decode_STi_ST<0>, OP_FMULP, FLAG_NONE, 2 },
	{ "fmulp", &Instruction::template decode_STi_ST<1>, OP_FMULP, FLAG_NONE, 2 },
	{ "fmulp", &Instruction::template decode_STi_ST<2>, OP_FMULP, FLAG_NONE, 2 },
	{ "fmulp", &Instruction::template decode_STi_ST<3>, OP_FMULP, FLAG_NONE, 2 },
	{ "fmulp", &Instruction::template decode_STi_ST<4>, OP_FMULP, FLAG_NONE, 2 },
	{ "fmulp", &Instruction::template decode_STi_ST<5>, OP_FMULP, FLAG_NONE, 2 },
	{ "fmulp", &Instruction::template decode_STi_ST<6>, OP_FMULP, FLAG_NONE, 2 },
	{ "fmulp", &Instruction::template decode_STi_ST<7>, OP_FMULP, FLAG_NONE, 2 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fcompp", &Instruction::decode0, OP_FCOMPP, FLAG_NONE, 0 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fsubrp", &Instruction::template decode_STi_ST<0>, OP_FSUBRP, FLAG_NONE, 2 },
	{ "fsubrp", &Instruction::template decode_STi_ST<1>, OP_FSUBRP, FLAG_NONE, 2 },
	{ "fsubrp", &Instruction::template decode_STi_ST<2>, OP_FSUBRP, FLAG_NONE, 2 },
	{ "fsubrp", &Instruction::template decode_STi_ST<3>, OP_FSUBRP, FLAG_NONE, 2 },
	{ "fsubrp", &Instruction::template decode_STi_ST<4>, OP_FSUBRP, FLAG_NONE, 2 },
	{ "fsubrp", &Instruction::template decode_STi_ST<5>, OP_FSUBRP, FLAG_NONE, 2 },
	{ "fsubrp", &Instruction::template decode_STi_ST<6>, OP_FSUBRP, FLAG_NONE, 2 },
	{ "fsubrp", &Instruction::template decode_STi_ST<7>, OP_FSUBRP, FLAG_NONE, 2 },
	{ "fsubp", &Instruction::template decode_STi_ST<0>, OP_FSUBP, FLAG_NONE, 2 },
	{ "fsubp", &Instruction::template decode_STi_ST<1>, OP_FSUBP, FLAG_NONE, 2 },
	{ "fsubp", &Instruction::template decode_STi_ST<2>, OP_FSUBP, FLAG_NONE, 2 },
	{ "fsubp", &Instruction::template decode_STi_ST<3>, OP_FSUBP, FLAG_NONE, 2 },
	{ "fsubp", &Instruction::template decode_STi_ST<4>, OP_FSUBP, FLAG_NONE, 2 },
	{ "fsubp", &Instruction::template decode_STi_ST<5>, OP_FSUBP, FLAG_NONE, 2 },
	{ "fsubp", &Instruction::template decode_STi_ST<6>, OP_FSUBP, FLAG_NONE, 2 },
	{ "fsubp", &Instruction::template decode_STi_ST<7>, OP_FSUBP, FLAG_NONE, 2 },
	{ "fdivrp", &Instruction::template decode_STi_ST<0>, OP_FDIVRP, FLAG_NONE, 2 },
	{ "fdivrp", &Instruction::template decode_STi_ST<1>, OP_FDIVRP, FLAG_NONE, 2 },
	{ "fdivrp", &Instruction::template decode_STi_ST<2>, OP_FDIVRP, FLAG_NONE, 2 },
	{ "fdivrp", &Instruction::template decode_STi_ST<3>, OP_FDIVRP, FLAG_NONE, 2 },
	{ "fdivrp", &Instruction::template decode_STi_ST<4>, OP_FDIVRP, FLAG_NONE, 2 },
	{ "fdivrp", &Instruction::template decode_STi_ST<5>, OP_FDIVRP, FLAG_NONE, 2 },
	{ "fdivrp", &Instruction::template decode_STi_ST<6>, OP_FDIVRP, FLAG_NONE, 2 },
	{ "fdivrp", &Instruction::template decode_STi_ST<7>, OP_FDIVRP, FLAG_NONE, 2 },
	{ "fdivp", &Instruction::template decode_STi_ST<0>, OP_FDIVP, FLAG_NONE, 2 },
	{ "fdivp", &Instruction::template decode_STi_ST<1>, OP_FDIVP, FLAG_NONE, 2 },
	{ "fdivp", &Instruction::template decode_STi_ST<2>, OP_FDIVP, FLAG_NONE, 2 },
	{ "fdivp", &Instruction::template decode_STi_ST<3>, OP_FDIVP, FLAG_NONE, 2 },
	{ "fdivp", &Instruction::template decode_STi_ST<4>, OP_FDIVP, FLAG_NONE, 2 },
	{ "fdivp", &Instruction::template decode_STi_ST<5>, OP_FDIVP, FLAG_NONE, 2 },
	{ "fdivp", &Instruction::template decode_STi_ST<6>, OP_FDIVP, FLAG_NONE, 2 },
	{ "fdivp", &Instruction::template decode_STi_ST<7>, OP_FDIVP, FLAG_NONE, 2 },

	/* 0xdf 0xc0 - 0xdf 0xff */
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fstsw", &Instruction::template decode_Reg<operand_t::REG_AX>, OP_FSTSW, FLAG_NONE, 1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "fucomip", &Instruction::template decode_ST_STi<0>, OP_FUCOMIP, FLAG_NONE, 2 },
	{ "fucomip", &Instruction::template decode_ST_STi<1>, OP_FUCOMIP, FLAG_NONE, 2 },
	{ "fucomip", &Instruction::template decode_ST_STi<2>, OP_FUCOMIP, FLAG_NONE, 2 },
	{ "fucomip", &Instruction::template decode_ST_STi<3>, OP_FUCOMIP, FLAG_NONE, 2 },
	{ "fucomip", &Instruction::template decode_ST_STi<4>, OP_FUCOMIP, FLAG_NONE, 2 },
	{ "fucomip", &Instruction::template decode_ST_STi<5>, OP_FUCOMIP, FLAG_NONE, 2 },
	{ "fucomip", &Instruction::template decode_ST_STi<6>, OP_FUCOMIP, FLAG_NONE, 2 },
	{ "fucomip", &Instruction::template decode_ST_STi<7>, OP_FUCOMIP, FLAG_NONE, 2 },
	{ "fcomip", &Instruction::template decode_ST_STi<0>, OP_FCOMIP, FLAG_NONE, 2 },
	{ "fcomip", &Instruction::template decode_ST_STi<1>, OP_FCOMIP, FLAG_NONE, 2 },
	{ "fcomip", &Instruction::template decode_ST_STi<2>, OP_FCOMIP, FLAG_NONE, 2 },
	{ "fcomip", &Instruction::template decode_ST_STi<3>, OP_FCOMIP, FLAG_NONE, 2 },
	{ "fcomip", &Instruction::template decode_ST_STi<4>, OP_FCOMIP, FLAG_NONE, 2 },
	{ "fcomip", &Instruction::template decode_ST_STi<5>, OP_FCOMIP, FLAG_NONE, 2 },
	{ "fcomip", &Instruction::template decode_ST_STi<6>, OP_FCOMIP, FLAG_NONE, 2 },
	{ "fcomip", &Instruction::template decode_ST_STi<7>, OP_FCOMIP, FLAG_NONE, 2 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
	{ "invalid", &Instruction::decode_invalid, OP_INVALID, FLAG_NONE, -1 },
};

#endif
